# ========================================================== # Clear Outlook AutoComplete Cache (System-Wide) # ========================================================== # Description: # Closes Microsoft Outlook, scans all user profiles in C:\Users, # removes Outlook AutoComplete cache files (NK2 and # Stream_Autocomplete files) for every user account. # # Outlook automatically rebuilds the cache when reopened. # ========================================================== Write-Host "=============================================" Write-Host " Outlook AutoComplete Cache Cleanup (All Users)" Write-Host "=============================================" # ---------------------------------------------------------- # Stop Outlook Process # ---------------------------------------------------------- Write-Host "`n[INFO] Closing Outlook..." Get-Process OUTLOOK -ErrorAction SilentlyContinue | ForEach-Object { $_.CloseMainWindow() | Out-Null # Wait up to 10 seconds for graceful close if (!$_.WaitForExit(10000)) { Write-Host "[INFO] Force closing Outlook..." $_ | Stop-Process -Force } } # ---------------------------------------------------------- # Get All User Profiles # ---------------------------------------------------------- $ExcludedUsers = @( "Public", "Default", "Default User", "All Users" ) # Add users passed through script arguments for ($i = 0; $i -lt $args.Count; $i++) { if (![string]::IsNullOrWhiteSpace($args[$i])) { $ExcludedUsers += $args[$i] } } # Get profiles excluding specified users $UserProfiles = Get-ChildItem "C:\Users" -Directory | Where-Object { $_.Name -notin $ExcludedUsers } if ($UserProfiles.Count -eq 0) { Write-Host "[ERROR] No user profiles found." exit } # ---------------------------------------------------------- # Process Each User Profile # ---------------------------------------------------------- foreach ($Profile in $UserProfiles) { Write-Host "`n=============================================" Write-Host "[INFO] Processing User: $($Profile.Name)" Write-Host "=============================================" # ------------------------------------------------------ # NK2 Files # ------------------------------------------------------ $NK2Path = Join-Path $Profile.FullName "AppData\Roaming\Microsoft\Outlook" Write-Host "`n[INFO] Checking NK2 files..." if (Test-Path $NK2Path) { $NK2Files = Get-ChildItem -Path $NK2Path -Filter "*.nk2" -ErrorAction SilentlyContinue if ($NK2Files) { foreach ($File in $NK2Files) { try { Remove-Item $File.FullName -Force -ErrorAction Stop Write-Host "[SUCCESS] Removed NK2 File: $($File.Name)" } catch { Write-Host "[FAILED] Unable to remove: $($File.Name)" } } } else { Write-Host "[INFO] No NK2 files found." } } else { Write-Host "[INFO] Outlook roaming folder not found." } # ------------------------------------------------------ # Stream_Autocomplete Files # ------------------------------------------------------ $RoamCachePath = Join-Path $Profile.FullName "AppData\Local\Microsoft\Outlook\RoamCache" Write-Host "`n[INFO] Checking Stream_Autocomplete files..." if (Test-Path $RoamCachePath) { $AutoCompleteFiles = Get-ChildItem ` -Path $RoamCachePath ` -Filter "Stream_Autocomplete*" ` -ErrorAction SilentlyContinue if ($AutoCompleteFiles) { foreach ($File in $AutoCompleteFiles) { try { Remove-Item $File.FullName -Force -ErrorAction Stop Write-Host "[SUCCESS] Removed AutoComplete File: $($File.Name)" } catch { Write-Host "[FAILED] Unable to remove: $($File.Name)" } } } else { Write-Host "[INFO] No Stream_Autocomplete files found." } } else { Write-Host "[INFO] RoamCache folder not found." } } # ---------------------------------------------------------- # Completion Message # ---------------------------------------------------------- Write-Host "`n=============================================" Write-Host " Outlook AutoComplete Cache Cleanup Completed" Write-Host "=============================================" Write-Host "`n[INFO] Outlook will rebuild the cache automatically when reopened."